Skip to main content

InnoDB 数据库引擎TableSpace Exists 问题

我自己的解决方法:

  1. 关闭数据库
  2. 删除表里的文件。
  3. my.ini 文件中添加 innodb_file_per_table=0
  4. 把数据复制到表里。
  5. 把my.ini 文件的 innodb_file_per_table=0 改为 innodb_file_per_table=1

数据库报错:

ERROR 1813 (HY000): Tablespace 'panda.t1' exists.

原因:

在使用InnoDB引擎的数据库中,所有已经存在的表都使用两个文件保存,假设表名为content,则在数据库的数据目录下会有两个文件,

(1).frm 文件   数据表定义信息  

(2).ibd 文件        数据表内容

处理方法:

遇到这种事情,最快的方式就是直接重装,但是我们一般不能这样做,重装数据库可不是闹着玩的。如果实在解决不了,大不了这个表名放弃算了。

在 MySql 5.6之前,这些文件都是可以公用的,如果 .frm 文件 丢失,则会报这个错,可以参考下面的博客(http://blog.csdn.net/u011478909/article/details/51589002 ),使用一个临时库,建立一个完全相同的表,然后拷贝这两个文件到丢失的库中,就可以进行正常操作,这种很简单,不再多言。

在MySql 5.6 及以后的版本,就没有这么简单了,因为数据库会默认使用表空间隔离,所以这时候这两个文件并不能通用,导致使用上面的办法并不能生效。

(1)停止 mysql 服务。

(2)使用 select @@datadir 查看Mysql数据文件存储的位置,打开这个位置,找到对应的数据库,发现有这两个文件。

(3)手动删除 .frm 文件,进行测试。这时候奇怪的事情发生了。

[SQL]CREATE TABLE content
(
id INT PRIMARY KEY NOT NULL,
name VARCHAR(64) NOT NULL
);
[Err] 1813 - Tablespace '`blog`.`content`' exists.

[SQL]SELECT * from content;
[Err] 1146 - Table 'blog.content' doesn't exist

按照网上有些大神介绍的方法,关掉mysql服务,直接把 .ibd 文件也删了,重启服务,这样的方法在低版本的mysql可能奏效,但是对于5.6以上的版本根本不行,因为.ibd 文件会自动恢复,然后就回到上面的问题了。原来5.6以上的版本两个文件都添加了index ,不能通用,默认是独立的。而且还会根据 information_schema 库和一些配置文件中的信息,恢复.ibd文件,但是我们还是有方法。

5.6 及以上版本处理方式

(1) 关掉mysql服务,删掉老的 blog.content,idb 文件,找到 my.ini 文件,修改 innodb_file_per_table=0 。重启服务。

(2) 新建一个测试test数据库,并新建一个 test.content 表,这时候data库的data目录只出现了.frm 文件,把这个文件拷贝到blog数据库的目录下。

(3) 这个时候回到blog 库,删掉并新建 content表,不再报错。

(4)网上有人说5.6 以上只能放弃这个表名,但是其实我们可以用这个方式解决问题,最后不要忘了把  my.ini 文件,修改 innodb_file_per_table=1 ,使用独立表空间的默认设置。